package com.xli.dto.controller;

import com.xli.dto.exception.DataValidationException;
import com.xli.security.thread.utils.LockManager;
import lombok.extern.slf4j.Slf4j;

import java.util.function.Supplier;

@Slf4j
public class BaseController {

    /**
     * 使用线程锁对多个方法锁线程，对性能略有影响
     * 高并发场景下可保证数据一致，但在集群模式下无效
     *
     * @param lock          锁名
     * @param existsChecker 条件方法（返回中布尔类型），若为true则代表满足条件，就会执行保存方法；若为false则抛出异常信息
     * @param saveFunction  保存方法，当条件方法返回true时才会执行
     * @param errorMessage  异常信息。当条件不满足时抛出异常信息
     * @param <T>           保存方法返回值
     * @throws Exception 异常
     */
    public <T> T saveIfNotExists(String lock, Supplier<Boolean> existsChecker, Supplier<T> saveFunction, String errorMessage) throws Exception {
        return LockManager.executeWithLock(lock, () -> {
            if (!existsChecker.get()) {
                throw new DataValidationException(errorMessage);
            }
            // 如果不存在，执行保存逻辑
            return saveFunction.get();
        });
    }
}
